package psn.kiko.config.web;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * on 2023/10/16 21:27
 */
public class JacksonObjectMapper extends ObjectMapper {
	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
	//	public static final String DEFAULT_DATE_TIME_FORMAT="yyyy-MM-dd HH:mm";
	public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
	
	public JacksonObjectMapper( ) {
		super( );
		//收到未知属性不报异常
		this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , false);
		//反序列化时，属性不存在的兼容处理
		this.getDeserializationConfig( ).withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
		
		SimpleModule simpleModule = new SimpleModule( )
				.addDeserializer(LocalDateTime.class ,
						new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
				.addDeserializer(LocalDate.class ,
						new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
				.addDeserializer(LocalTime.class ,
						new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
				.addSerializer(LocalDateTime.class ,
						new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
				.addSerializer(LocalDate.class ,
						new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
				.addSerializer(LocalTime.class ,
						new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
		
		//注册功能模块，例如，可以添加自定义序列化器和反序列化器
		this.registerModule(simpleModule);
	}
}
